package com.sz.virtualbank.dao.mapper;

import com.sz.virtualbank.dao.entity.LoanRepaymentPlan;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;

/**
 * 贷款还款计划Mapper接口
 * 
 * @author Claude
 */
@Mapper
public interface LoanRepaymentPlanMapper {
    
    /**
     * 批量新增还款计划
     *
     * @param repaymentPlans 还款计划列表
     * @return 影响行数
     */
    int batchInsert(List<LoanRepaymentPlan> repaymentPlans);
    
    /**
     * 更新还款计划
     *
     * @param repaymentPlan 还款计划
     * @return 影响行数
     */
    int update(LoanRepaymentPlan repaymentPlan);
    
    /**
     * 根据ID查询还款计划
     *
     * @param id 还款计划ID
     * @return 还款计划
     */
    LoanRepaymentPlan selectById(Long id);
    
    /**
     * 查询贷款的还款计划列表
     *
     * @param loanId 贷款ID
     * @return 还款计划列表
     */
    List<LoanRepaymentPlan> selectByLoanId(Long loanId);
    
    /**
     * 更新还款计划状态
     *
     * @param id 还款计划ID
     * @param status 状态
     * @return 影响行数
     */
    int updateStatus(@Param("id") Long id, @Param("status") Integer status);
    
    /**
     * 查询即将到期的还款计划
     *
     * @param dueDate 到期日
     * @return 还款计划列表
     */
    List<LoanRepaymentPlan> selectByDueDate(LocalDate dueDate);
    
    /**
     * 查询逾期的还款计划
     *
     * @param date 当前日期
     * @return 还款计划列表
     */
    List<LoanRepaymentPlan> selectOverduePlans(LocalDate date);
    
    /**
     * 记录还款信息
     *
     * @param id 还款计划ID
     * @param actualPayment 实际还款金额
     * @param status 状态
     * @return 影响行数
     */
    int recordPayment(@Param("id") Long id, 
                     @Param("actualPayment") java.math.BigDecimal actualPayment, 
                     @Param("status") Integer status);
    
    /**
     * 删除贷款的所有还款计划
     *
     * @param loanId 贷款ID
     * @return 影响行数
     */
    int deleteByLoanId(Long loanId);
}
